// routes/tourGuideRoutes.js

const express = require('express');
const router = express.Router();
const db = require('./db');


// 获取所有地点信息
//调用方法http://127.0.0.1:3000/api/loc/locations
router.get('/locations', (req, res) => {
    db.query('SELECT * FROM locations', (err, results) => {
      if (err) {
        console.error('Error querying database: ' + err.stack);
        res.status(500).json({ error: 'Database error' });
        return;
      }
      res.json(results);
      //返回一个JSON表单例如
      /*[
          {
            "spotname": "教学楼",
            "latitude": "35",
            "longitude": "352",
            "description": "542"
          },
          {
            "spotname": "武汉",
            "latitude": "2",
            "longitude": "3",
            "description": "564"
          },
          {
            "spotname": "牌坊",
            "latitude": "11",
            "longitude": "11",
            "description": "1123"
          }
        ]*/
    });
  });
  


//调用方法http://127.0.0.1:3000/api/loc/find
  router.post('/find', (req, res) => {
    const spotname = req.body.spotname;
  
    // 检查是否提供了地点名称
    if (!spotname || spotname.trim() === '') {
      // 如果没有提供地点名称或只提供了空格，返回错误提示
      res.status(400).json({ error: '地点名称不能为空' });
    } else {
      // 如果提供了地点名称，查询数据库
      db.query('SELECT * FROM locations WHERE spotname = ?', [spotname], (err, results) => {
        if (err) {
          console.error('Error querying database: ' + err.stack);
          res.status(500).json({ error: '抱歉，数据库出错了' });
          return;
        }
        if (results.length === 0) {
          // 如果没有找到匹配的地点，返回错误信息
          res.status(404).json({ error: '地点不存在，请重新输入' });
        } else {
          // 如果找到了地点，返回第一个地点信息
          res.json(results[0]);
        }
      });
    }
  });



  // 添加新地点
  //调用方法http://127.0.0.1:3000/api/loc/locations
  /*附带JSON表单例如
  {
    "spotname": "大道",
    "latitude": "353",
    "longitude": "35232",
    "description": "543422"
  }*/
    router.post('/locations', (req, res) => {
      const newLocation = {
        spotname: req.body.spotname,
        latitude: req.body.latitude,
        longitude: req.body.longitude,
        description: req.body.description,
      };
    
      // 查询数据库，检查是否已存在相同地点名的记录
      db.query('SELECT * FROM locations WHERE spotname = ?', newLocation.spotname, (selectErr, selectResults) => {
        if (selectErr) {
          console.error('Error querying database: ' + selectErr.stack);
          res.status(500).json({ error: '抱歉，数据库出错了' });
          return;
        }
    
        if (selectResults.length > 0) {
          // 如果已经存在相同地点名的记录，则返回错误信息
          res.status(400).json({ error: '地点已存在，请勿重复添加' });
        } else {
          // 如果不存在相同地点名的记录，则执行插入操作
          db.query('INSERT INTO locations SET ?', newLocation, (insertErr, results) => {
            if (insertErr) {
              console.error('Error inserting into database: ' + insertErr.stack);
              res.status(500).json({ error: '抱歉，数据库出错了' });
              return;
            }
            res.json({ message: '地点添加成功！' });
          });
        }
      });
    });
  



// 更新地点信息
  //调用方法http://127.0.0.1:3000/api/loc/locations
  /*附带JSON表单例如
  {
    "spotname": "大道",
    "latitude": "353",
    "longitude": "35232",
    "description": "543422"
  }*/  
router.put('/locations', (req, res) => {
  const updatedLocation = {
      spotname: req.body.spotname,
      latitude: req.body.latitude,
      longitude: req.body.longitude,
      description: req.body.description,
  };

  // 查询数据库，确认地点是否存在
  db.query('SELECT * FROM locations WHERE spotname = ?', updatedLocation.spotname, (selectErr, selectResults) => {
      if (selectErr) {
          console.error('Error querying database: ' + selectErr.stack);
          res.status(500).json({ error: '抱歉，数据库错误' });
          return;
      }

      // 如果未查询到符合条件的地点记录，则返回地点不存在的错误信息
      if (selectResults.length === 0) {
          res.status(404).json({ error: '地点不存在' });
          return;
      }

      // 更新地点信息
      db.query('UPDATE locations SET ? WHERE spotname = ?', [updatedLocation, updatedLocation.spotname], (updateErr, results) => {
          if (updateErr) {
              console.error('Error updating database: ' + updateErr.stack);
              res.status(500).json({ error: '抱歉，数据库错误' });
              return;
          }
          res.json({ message: '地点更新成功' });
      });
  });
});



// 删除地点
  //调用方法http://127.0.0.1:3000/api/loc/locations
  /*附带JSON表单例如
  {
    "spotname": "大道",
  }*/  
    router.delete('/locations', (req, res) => {
      const { spotname } = req.body;
    
      if (!spotname) {
        res.status(400).json({ error: '地点名未提供' });
        return;
      }
    
      // 开启事务
      db.beginTransaction((err) => {
        if (err) {
          console.error('Error starting transaction: ' + err.stack);
          res.status(500).json({ error: '数据库事务启动失败' });
          return;
        }
    
        // 先检查地点是否存在
        db.query('SELECT * FROM locations WHERE spotname = ?', spotname, (selectErr, selectResults) => {
          if (selectErr) {
            db.rollback(() => {
              console.error('Error querying database: ' + selectErr.stack);
              res.status(500).json({ error: '抱歉，数据库出错了' });
            });
            return;
          }
    
          if (selectResults.length === 0) {
            db.rollback(() => {
              res.status(404).json({ error: '地点不存在' });
            });
            return;
          }
    
          // 删除地点
          db.query('DELETE FROM locations WHERE spotname = ?', spotname, (deleteLocErr) => {
            if (deleteLocErr) {
              db.rollback(() => {
                console.error('Error deleting location: ' + deleteLocErr.stack);
                res.status(500).json({ error: '删除地点失败' });
              });
              return;
            }
    
            // 删除相关的边
            db.query('DELETE FROM edge WHERE from_node = ? OR to_node = ?', [spotname, spotname], (deleteEdgeErr) => {
              if (deleteEdgeErr) {
                db.rollback(() => {
                  console.error('Error deleting related edges: ' + deleteEdgeErr.stack);
                  res.status(500).json({ error: '删除相关边失败' });
                });
                return;
              }
    
              // 提交事务
              db.commit((commitErr) => {
                if (commitErr) {
                  db.rollback(() => {
                    console.error('Error committing transaction: ' + commitErr.stack);
                    res.status(500).json({ error: '事务提交失败' });
                  });
                  return;
                }
                res.json({ message: '地点及其相关边删除成功' });
              });
            });
          });
        });
      });
    });



module.exports = router;